package com.qr;

/**
 * redis：
 *      Remote  DIctionary server   远程字典服务
 *      是一个C语言开发的键值对数据库
 *          数据间没有必然的关系
 *          单线程模型
 *          高性能
 *          多数据类型：
 *              字符串：string
 *              列表：list
 *              散列：hash
 *              集合：set
 *              有序集合:sorted_set
 *      应用:
 *          热点数据处理
 *          秒杀，抢购
 *          排行榜，访问统计，实时查询，设备信号
 *          验证码，投票控制
 *          分布式的数据共享，分布式集群架构中的session分离
 *      下载和安装：
 *          windows下启动，解压即用：redis-server.exe 操作：redis-client
 *
 *
 *      数据类型:
 *          string:
 *              用来存储单个数据
 *              一个存储空间保存一个数据
 *              通常用来存储字符串，如果字符串是整数，那么可以当做数字使用
 *              set name value(如zhangsan)       设置
 *              键是唯一的可以通过键直接获取
 *              get name    获取
 *              del name    删除
 *              一次设置多个，如果有已经存在的，那么就会被覆盖
 *                  mset a 1 b 2 c 3 d 4
 *                  mget a b c d
 *              查看对应字符串的长度
 *                  strlen name
 *              在字符串后面进行追加
 *                  append name abc
 *                  如果name这个键不存在，那么这就是一个set的动作
 *
 *              企业中分库分表主键问题：
 *                  如果需要分库分表进行存储
 *                  那么分离开的表也应该保证主键唯一，不能和其他分开的表中的主键重复
 *                  自增：
 *                      incr number  在原来的基础上加1
 *                      decr number  在原来的基础上减1
 *                      incrby number 10    指定10进行增加
 *                      decrby number 5     指定值进行减少
 *                      incrbyfloat number 1.1  指定小数进行增加
 *              string在redis内部是一个字符串，当遇到增减类业务的时候会转换成数字进行操作
 *              redis所有的操做都具有原子行，采用单线程机制，其命令是一个一个执行的
 *              当原始值不能够转换成数字，或者超过redis数字上限范围就是longmaxvalue
 *
 *              设置数据的生命周期：
 *                  setex name seconds 20 设置20秒后过期
 *                  psetex name milliseconds 2000 设置2秒后过期
 *
 *
 *          hash:
 *              String的存储方式：
 *                  set user:id:111:fans 200    粉丝数
 *                  set user:id:111:blogs 30    博客数
 *                  set user:id:111:focus 200   关注数
 *                  存储对象：
 *                  set user:id:111 {id:111,fans:200,blogs:30,focus:200}
 *              hash存储：
 *                  hset user name zs
 *                  hset user age 20
 *                  hget user name
 *                  hdel user name
 *                  hgetall user获取所有的值
 *                  一次性的设置多个值：
 *                      hmset user name zs age 20 money 300
 *                  一次性获取多个值：
 *                      hmget user name age money
 *                  查看对应field的个数：（field就是name age money这些）
 *                      hlen user
 *                  判断user这个hash中是否存在name字段
 *                      hexists user name
 *                  获取所有的field字段：
 *                      hkeys user
 *                  获取field字段对应的值：
 *                      hvals user
 *                  hash类型下的value只能存储字符串，不能够存储其他类型
 *                  每个hash可以存储2的32次方-1个键值对
 *                  使用hset进行创建的手，如果已经存在的键那么是会进行覆盖的，可以使用hsetnx来进行解决
 *                      hsetnx user ss 100 如果有则不会改变，如经过没有就进行添加
 *
 *                  redis实现抢购：
 *                      三种商品，每一种对应抢购数量有100 200 500
 *                      hmset goods goods1 100 goods2 200 goods3 500
 *                      hincrby goods gooods1 -1
 *                      hincrby goods gooods2 -20
 *                      通过这种操作来控制某种商品的数量，但是实际过程中可能存在超卖现象
 *                      具体还是需要通过代码来进行控制
 *                  业务操作最好还是在代码中来进行控制
 *
 *          list:
 *              存在某种需求，需要对存储的数据进入存储空间的顺序进行区分
 *              list保存多个数据，底层使用双向链表结构来实现
 *              lpush list1 aa
 *              lpush list1 bb
 *              lpush list1 cc
 *              lpush list1 dd
 *              读取元素：
 *                  lrange list1 0 3    索引从0开始到3结束
 *                  dd cc bb aa每次添加都会往集合左边添加
 *              每次添加往右边进行添加：
 *                  一次性的添加多个
 *                  rpush list2 aa bb cc dd
 *                  如果想要按照添加顺序进行查看，就需要rpush lrange  右边添加，左边开始查看
 *                  lrange list2 0 3
 *                     aa bb cc dd
 *              当不知道集合中有多少个元素时，查看全部
 *                  lrange list1 0 -1
 *              查看倒数第二个：
 *                  lrange list1 0 -2
 *              查看对应下标的值：
 *                  lindex list1 0
 *              查看list的长度：
 *                  llen list1
 *              获取并且移除数据：
 *                  lpop key
 *                  rpop key
 *                  lpush list3 a b c
 *                  lpop list3  c在最左边先移除c
 *                  rpop list3  a在最右边移除a
 *              规定时间内获取并移除：
 *                  blpop
 *                      blpop list1 30  30秒移除list1中最左边的元素
 *                  brpop
 *                      brpop list1 30  30秒内移除list1中最右边的元素
 *                  可以指定多个列表，从多个列表中获取并移除
 *                      blpop  [list1,list2] timeout
 *
 *              list实现朋友圈点赞：
 *                  点赞需要按照点赞的顺序在下面显示出来
 *                  rpush ss a b c d
 *                  移除集合中的d，移除一个，list中是可以存储重复的元素的，当指定多个的时候，就可以移除多个
 *                      lrem ss 1 d
 *              list中保存的都是string类型
 *              最多保存2的32次方-1个元素
 *
 *          set:
 *              list是一个链表，当存储大量的元素的时候，读取的速度比较慢
 *              需要一种存储结构，可以保存大量的数据，便于查询
 *              set与hash结构完全相同，只是存储的是键，不存储值，，不允许重复
 *              sadd users zs
 *              sadd users ls
 *              sadd users ww
 *              查看元素，无序
 *                  smembers users
 *              删除元素：
 *                  srem users ww
 *              查看元素的个数：
 *                  scard users
 *              判断是否存在某个元素：
 *                  存在返回1，不存在返回0
 *                  sismember users ww
 *
 *              虎牙直播首次注册会设置兴趣爱好多个，这只是推送的一部分
 *              另外一部分是从一个大的集合中随机获取，通过推送摸索用户的其他兴趣爱好
 *              随机获取集合中指定数量的数据：
 *                  srandmember users 1     随机获取一个
 *                  srandmember users 3     随机获取三个
 *
 *              随机剔除：原始集合会跟着发生变化
 *                  spop users
 *                  spop users 2    随机剔除两个
 *
 *              sadd u1 a
 *              sadd u1 b
 *              sadd u1 c
 *              sadd u2 b
 *              sadd u2 c
 *              交集：
 *                  sinter u1 u2
 *              并集：
 *                  sunion u1 u2
 *              差集：谁前谁后是不一样的
 *                  sdiff u1 u2
 *                  sdiff u2 u1
 *              获取到新的集合中：
 *                  sinterstore u3 u1 u2 将两个集合的交集存储到新的集合u3中
 *                  sunionstore
 *                  sdiffstore
 *              将指定的数据从原始集合移动到目标集合当中：
 *                  smove u2 u1 w   将u2中的w移动到u1中
 *
 *              set模拟权限验证：
 *                  不允许存储重复值，通过键设定值，通过值定义权限
 *                  sismember users insert 判断值是否存在，从而判断权限
 *
 *
 *          sorted_set:
 *              数据排序有利于数据的有效展示
 *              set不能够保证数据有序性，需要一种结构可以保证数据的有序性
 *              zadd users 10 zs
 *              zadd users 30 ls
 *              zadd users 20 ww
 *              zadd users 15 zl
 *              10 30 20 15是我们添加的排序的字段
 *              在获取数据的时候会根据这个字段进行展示数据
 *              获取：
 *                  zrange users 0 -1
 *              取数据的时候带上scores
 *                  zrange users 0 -1 withscores
 *              反向读取：
 *                  zrevrange users 0 -1 withscores
 *              去除某个元素：根据具体的值来进行去除
 *                  zrem users ww
 *              按条件获取数据：
 *                  获取users值在20到30之间的
 *                      zrangebyscore users 20 30 withscores
 *                  获取的时候只取前三个
 *                      zrangebyscore users 20 30 limit 0 3 withscores
 *              按条件删除：
 *                  删除users10到20之间的值
 *                      zremrangebyscore users 10 20
 *                  删除的时候按照索引范围进行删除：
 *                      zremrangebyrank users 0 1
 *              获取集合数据总量：
 *                  zcard users
 *              查看范围内的数据：
 *                  zcount users 30 50
 *              合并新的集合：
 *                  新建三个集合：
 *                      zadd s1 50 aa 60 bb 70 cc
 *                      zadd s2 60 aa 70 bb 80 dd
 *                      zadd s3 70 aa 80 bb 90 ee
 *                  将三个集合合并成一个新的集合：
 *                      zinterstore ss s1 s2 s3
 *                  查看：
 *                      zrange ss 0 -1 withscores
 *                      结果是bb 210 aa 180
 *                      这个结果是s1 s2 s3中三个集合中的共有属性 aa bb 之和组合成的值
 *                  合并后求最大的交集：
 *                      zinterstore sss s1 s2 s3 aggregate max
 *                      这个获取的是bb 80 aa 70组成的一个集合
 *                  获取数据对应的索引，排名
 *                      zadd movies 143 aa 97 bb 200 cc
 *                      由小到大获取bb的索引为0，这个可以当做排名
 *                          zrank movies bb
 *                      由大到小获取bb为3
 *                          zrevrank movies bb
 *                   查看值：
 *                      zscore  movies aa
 *                   对值进行加一：
 *                      zincrby movies 1 aa
 *               score保存的数据可以是一个双精度的double值，浮点数可能会发生精度损失
 *               sorted_set底层存储是基于set结构的，所以数据不能重复
 *               如果重复添加相同的数据，那么score将会被反复覆盖，保留最后一次修改的结果
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
public class RedisDescribe {

    public static void main(String[] args) {
        System.out.println("hello");
    }

}
